package org.example.DesignPatterns.Proxy.Internet;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;

/**
 * @description:不管是代理互联网业务还是代理局域网业务，都基于同一份黑名单对地址访问地址进行校验
 *              单看这个黑名单过滤功能的代理，它应该是一个通用的过滤器，不应该与任何业务接口发生
 *              关联。在运行时针对某业务接口动态的生成具备黑名单过滤功能的代理
 * @author: farprt
 * @create: 2022-09-18 15:59
 **/

//这个Invo....接口定义了动态反射调用的标准，意味着黑名单过滤器可以代理任意类的任意方法
public class BlackListFilter implements InvocationHandler {

    private List<String> blackList= Arrays.asList("Game","Music");

    //被代理的真实对象，如猫，交换机等
    private Object origin;

    public BlackListFilter(Object origin){
        this.origin=origin;//注入被代理的对象
        System.out.println("开启黑名单过滤功能...");
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String arg=args[0].toString();
        for(String keyword:blackList){
            if(arg.contains(keyword)){
                System.out.println("禁止访问"+arg);
                return null;
            }
        }
        System.out.println("校验通过，转向实际业务...");
        return method.invoke(origin,arg);
    }
}